AWS SDK for JavaScript を使って ECSタスクスケジュールを設定する
はじめに
おはようございます、もきゅりんです。
Shall we ecs ?
タイトルのような検証があったため、ブログにしておきました。
やること
このブログでやることは、以下です。
AWS SDK for JavaScript (V3) を使って、 ECSタスクスケジュールを設定します。
前提として、ECSタスクを実行するためのECSクラスターやタスク定義などのリソースはすでに準備されているとします。
環境
- node 16.17.0
- npm 8.15.0
- typescript 4.7.4
- @aws-sdk/client-eventbridge/3.154.0
実行する
環境変数およびサブネットIDやセキュリティグループIDは環境に合わせて、よしなに放り込んで下さい。
細かいパラメータの調整は、文末の参考URLをご参照下さい。
import { EventBridgeClient, PutRuleCommand, PutRuleCommandInput, PutTargetsCommand, PutTargetsCommandInput, } from '@aws-sdk/client-eventbridge'; const REGION = process.env.REGION; const eventBridgeIamRoleArn = process.env.eventBridgeIamRoleArn; const ecsClusterArn = process.env.ecsClusterArn; const taskDefArn = process.env.taskDefArn; export const client = new EventBridgeClient({ region: REGION }); const main = async () => { const ebRuleParams: PutRuleCommandInput = { Name: 'DEMO_EVENT_RULE', RoleArn: eventBridgeIamRoleArn, ScheduleExpression: 'cron(0/5 * * * ? *)', State: 'ENABLED', }; const ebTargetParams: PutTargetsCommandInput = { Rule: 'DEMO_EVENT_RULE' /* required */, Targets: [ /* required */ { Arn: ecsClusterArn /* required */, RoleArn: eventBridgeIamRoleArn, Id: 'ecs-task-target' /* required */, EcsParameters: { TaskDefinitionArn: taskDefArn /* required */, EnableExecuteCommand: true, EnableECSManagedTags: true, LaunchType: 'FARGATE', NetworkConfiguration: { awsvpcConfiguration: { Subnets: [ /* required */ 'subnet-exxxxxx', 'subnet-dxxxxxx', ], AssignPublicIp: 'ENABLED', SecurityGroups: ['sg-0xxxxxxxxxxxxxx'], }, }, PropagateTags: 'TASK_DEFINITION', TaskCount: 1, }, Input: '{"env":"dev"}', }, ], }; try { const res = await client.send(new PutRuleCommand(ebRuleParams)); console.log('Success', res.RuleArn); const targetRes = await client.send(new PutTargetsCommand(ebTargetParams)); console.log('Success', targetRes); } catch (err: unknown) { console.error(err); } }; main();
$ REGION=ap-northeast-1 $ ts-node index.ts Success arn:aws:events:ap-northeast-1:xxxxxxxx:rule/DEMO_EVENT_RULE Success { '$metadata': { httpStatusCode: 200, requestId: '0d92fc69-4a78-40ad-8087-39881a86e463', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, FailedEntries: [], FailedEntryCount: 0 }
こんな感じで入力値を含んだイベントスケジュールが作成されればOKです。
さいごに
Arn (required) - The Amazon Resource Name (ARN) of the target.
て書いてあるけども、何を入れれば良いの?と思っていましたが、とりあえずコンソール画面で設定を試みて、何を入力すれば良さそうなのか目視確認して、クラスターARN と理解しました。
コード化するときも、基本はまずコンソールで触ってみる、が基本でございますね。
なお、rate スケジュールは設定後にすぐタスクが実行されて、その後にレート時間ごとに実行されていくのですね、使ったことがなかったので知りませんでした。
以上です。
どなたかの参考になれば幸いです。